#include "ModRunCommand.h"
#include <QDebug>

#include "../Output/FactoryOutput.h"

#include "Gof23/Gof_Command/CommandConcrete.h"
#include "Gof23/Gof_Command/Invoke.h"
#include "Gof23/Gof_Command/Receiver.h"

//命令模式的ModRun（Command）;
ModRunCommand::ModRunCommand()
{
    //模式名称;
    m_strModelName = "命令模式（Command）;";
    //模式描述;
    m_strModelDesc = "命令模式：命令模式是一种行为型设计模式，它可以将请求封装成对象，从而允许我们使用不同的请求、队列或日志来参数化其他对象。\n"
                     "同时也支持可撤销的操作。\n"
                     "命令模式中有四个角色：Command（抽象命令类）、ConcreteCommand（具体命令类）、Invoker（调用者类）和 Receiver（接收者类）。\n"
                     ;
}

//初始化显示模式;
void ModRunCommand::InitDisplay()
{
    qDebug() << m_strModelName;
    std::shared_ptr<IOutput> pOutPut = FactoryOutput::GetInstance()->CreateDescOutput();
    if (pOutPut)
    {
        std::initializer_list<QString> outList{ m_strModelName,m_strModelDesc};
        pOutPut->OutPut(outList);
    }
}

//返回模式类型;
EnumModRun ModRunCommand::GetEnum()
{
    return emModRunCommand;
}

//运行模式;
void ModRunCommand::ModRun()
{
    std::shared_ptr<IOutput> pOutPut = FactoryOutput::GetInstance()->CreateRunOutput();
    if (pOutPut)
    {
        std::initializer_list<QString> outListStart{ "========命令模式（Command） start:=======" };
        std::initializer_list<QString> outListEnd{ "========命令模式（Command） end:=======" };
        pOutPut->OutPut(outListStart);

        //命令模式（Command）;
        //解耦命令的发出者和执行者;
        //可以在发出时实现批处理效果;
        //命令可以有执行，撤销等操作;
        std::shared_ptr<Receiver> pReceiver(new Receiver());
        std::shared_ptr<CommandConcrete> pCommand(new CommandConcrete(pReceiver));
        std::shared_ptr<Invoke> pInvoke(new Invoke(pCommand));


        pInvoke->Call();

        
        pOutPut->OutPut(outListEnd);
    }

}

InterFaceModRun* ModRunCommand::CreateMe()
{
    return new ModRunCommand();
}
